主鍵
的機制在CASSANDRA/SCYLLA 可以說是非常關鍵,但一開始筆者自己在理解上,覺得很難了解其意,直到對於CASSANDRA/SCYLLA 的結構上有大致的了解,之後才稍微比較好懂。
所以回過頭來,今天要來講primary key的部分。
RDMS裡面也有 primary key,代表某張table欄位的唯一值,設定為primary key的欄位可以是單一一個,也可以是多個欄位組合,如果是多個欄位組合而成的primary key,組合出來的數值也不可以重複。
以上在CASSANDRA/SCYLLA 也是一樣的,但是primary的作用,遠遠不只RDBMS。
以單一一個欄位作為primary key,那麼這個primary key也就等於partition key
。
如果是多個複合欄位,那個這個primary key
= partition key + clustering key
partition key 也叫分區
的key,顧名思義,這個key對於分散式資料庫來講,關係到資料的擺放位置機制,不論是寫入或者查詢策略,都跟partition key息息相關。
clustering key的欄位,又稱clustering column。
請注意一點,partition key 可以由一個以上的欄位組成,clustering key同樣也是。
如下面的語法,
cqlsh> USE cycling;
CREATE TABLE rank_by_year_and_name (
race_year int,
race_name text,
cyclist_name text,
rank int,
PRIMARY KEY ((race_year, race_name), rank)
);
(race_year, race_name) 屬於partition key。
一旦partition key有複數個,那麼在下where條件時,就必定都要指定,譬如上面的舉例來說,race_year和race_name都要出現在where裡面,否則系統會跳出警告並不讓你執行。
rank 屬於clustering key。
TTL 不能設定是primary key的column,相對的,一個row裡面,非primary key的欄位都可以設定TTL。
(筆者猜測與這資料的分區處理有關,因為partition key在primary key裡面,但找到的官方說明,並沒有特別再額外解釋。)
一旦某個column的TTL過期,CASSANDRA/SCYLLA會檢查整個row,若裡面除了primary key以外的欄位都失效了,該行row也會跟著被刪掉,變得不存在。